// // 打印从1到n位数的最大值
#include <iostream>
#include <cstring>

// 打印数字
void PrintNumber(char *number)
{
    size_t nLnegth = strlen(number);
    bool isZero = true;
    for(int i = 0; i < nLnegth; i++)
    {
        if(isZero && number[i] != '0')
            isZero = false;
        if(!isZero)
        {
            printf("%s ", number + i);
            break;
        }
    }
}

// 数字的递增
bool Increment(char *number)
{
    //是否溢出的标记位
    bool isOverflow = false;
    //是否有进位的标记位
    int nTakeOver = 0;
    int nLength = strlen(number);
    for(int i = nLength - 1; i >= 0; i--)
    {
        int nSum = number[i] - '0' + nTakeOver;
        //如果是最后一位的话，就是循环刚开始，需要数据递增所以+1
        if(i == nLength - 1)
            nSum++;
        //是否需要进位
        if(nSum >= 10)
        {
            //已经是最高位了，在进位就溢出了
            if(i == 0)
                isOverflow = true;
            //进位
            else
            {
                nSum -= 10;
                nTakeOver = 1;
                number[i] = nSum + '0';
            }
        }
        else
        {
            number[i] = nSum + '0';
            break;
        }
    }
    return isOverflow;
}

void Print1ToMaxOfDigits(int n)
{
    if (n <= 0)
        return;

    char *number = new char[n + 1];
    //一定要初始化的，因为所有空间我们都是要访问的。
    memset(number, '0', n);
    number[n] = '\0';

    while (!Increment(number))
    {
        PrintNumber(number);
    }
    delete[] number;
    std::cout << std::endl;
}

int main()
{
    Print1ToMaxOfDigits(3);
    return 0;
}